package routers

import (
	"gameserver/gcommon"
	"gameserver/messages"
	"net/http"

	"gitee.com/night-tc/gobige/common"
	"gitee.com/night-tc/gobige/logger"
	"github.com/gin-gonic/gin"
	"github.com/go-sql-driver/mysql"
)

// ChangePlayerName_Handler 处理玩家改名请求
func ChangePlayerName_Handler(c *gin.Context) {
	// 解析请求体中的JSON数据到消息结构体
	msg := new(messages.ChangePlayerNameSrvReq)
	var err error
	defer func() {
		// 错误处理逻辑，返回错误信息
		if err != nil {
			logger.Warnf("ChangePlayerName_Handler fail msg:%s err:%v", msg, err)
			if v, ok := err.(*common.Error); ok {
				c.JSON(http.StatusOK, gin.H{"Result": v.ErrCode})
			} else {
				c.JSON(http.StatusOK, gin.H{"Result": gcommon.RETMSG_Tips_Param_Fail})
			}
		}
	}()

	err = c.ShouldBindJSON(msg)
	if err != nil {
		return
	}

	// 检查昵称长度是否合法
	if len([]rune(msg.PlayerName)) > MAX_NICKNAME_LENGTH {
		err = gcommon.Err_User_Name_Length
		return
	} else if !gcommon.IsValidNickName(msg.PlayerName) {
		// 检查昵称是否符合正则规则
		err = gcommon.Err_User_Name_Not_Legal
		return
		// } else if !filter.FilterLegal(msg.PlayerID, msg.PlayerName) {
		// 	// 检查昵称是否通过敏感词过滤
		// 	err = gcommon.Err_User_Name_Not_Legal
		// 	return
	}

	// 更新玩家昵称
	perr := UpPlayerName(msg.PlayerID, msg.PlayerName)
	if perr != nil {
		// 处理数据库错误，例如重复昵称
		if mysqlErr, ok := perr.(*mysql.MySQLError); ok {
			if mysqlErr.Number == 1062 {
				err = gcommon.Err_User_Name_Repeat
			} else {
				err = perr
			}
		} else {
			err = perr
		}
		return
	}

	// 返回成功响应
	c.JSON(http.StatusOK, gin.H{"Result": gcommon.RETMSG_success})
}

// CheckLegalName_Handler 检查昵称是否合法
func CheckLegalName_Handler(c *gin.Context) {
	// 解析请求体中的JSON数据到消息结构体
	msg := new(messages.CheckLegalNameSrvReq)
	var err error
	defer func() {
		// 错误处理逻辑，返回错误信息
		if err != nil {
			logger.Warnf("CheckLegalName_Handler fail msg:%s err:%v", msg, err)
			if v, ok := err.(*common.Error); ok {
				c.JSON(http.StatusOK, gin.H{"Result": v.ErrCode})
			} else {
				c.JSON(http.StatusOK, gin.H{"Result": gcommon.RETMSG_Tips_Param_Fail})
			}
		}
	}()

	err = c.ShouldBindJSON(msg)
	if err != nil {
		return
	}

	// 初始化返回消息
	ret := new(messages.CheckLegalNameSrvRet)

	// 遍历玩家昵称列表，检查每个昵称是否合法
	for _, v := range msg.PlayerNames {
		if len([]rune(v)) > MAX_NICKNAME_LENGTH {
			// 跳过长度超限的昵称
			continue
		} else if !gcommon.IsValidNickName(v) {
			// 跳过不符合正则规则的昵称
			continue
			// } else if !filter.FilterLegal(0, v) {
			// 	// 跳过未通过敏感词过滤的昵称
			// 	continue
		}
		// 添加合法昵称到返回列表
		ret.PlayerNames = append(ret.PlayerNames, v)
	}

	// 检查昵称是否重复
	// 如果需要groupid下不重复的话，就把groupid传过来
	ret.PlayerNames = CheckNames(ret.PlayerNames)

	// 返回合法昵称列表
	c.JSON(http.StatusOK, ret)
}

func UpExData_Handler(c *gin.Context) {
	// 解析请求体中的JSON数据到消息结构体
	msg := new(messages.UpExDataSrvReq)
	var err error
	defer func() {
		// 错误处理逻辑，返回错误信息
		if err != nil {
			logger.Warnf("UpExData_Handler fail msg:%s err:%v", msg, err)
			if v, ok := err.(*common.Error); ok {
				c.JSON(http.StatusOK, gin.H{"Result": v.ErrCode})
			} else {
				c.JSON(http.StatusOK, gin.H{"Result": gcommon.RETMSG_Tips_Param_Fail})
			}
		}
	}()

	err = c.ShouldBindJSON(msg)
	if err != nil {
		return
	}
	err = UpPlayerExData(msg.PlayerID, msg.ExData)
	if err != nil {
		return
	}
	c.JSON(http.StatusOK, gin.H{"Result": gcommon.RETMSG_success})
}
